How to use Morphological Analyzer Engine MeCab using Python3
MeCab is a morphological analyzer engine. We will illustrate how to use MeCab using Python3.
Environment
- macOS 10.13.6
- Python 3.6.4
Setting
Install MeCab and dictionary, mecab-python3
$ brew install mecab mecab-ipadic git curl xz $ pip install mecab-python3
Install mecab-ipadic-NEolog
Since the standard dictionary is not able to handle EC2
and S3
well, we also install the system dictionary mecab-ipadic-NEologd with new words on the web.
For details of the installation method, please check mecab-ipadic-NEologd : Neologism dictionary for MeCab.
$ git clone --depth 1 [email protected]:neologd/mecab-ipadic-neologd.git $ cd mecab-ipadic-neologd $ ./bin/install-mecab-ipadic-neologd -n
We can check the directory path for mecab-ipadic-neologd with the following command.
$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd" /usr/local/lib/mecab/dic/mecab-ipadic-neologd
How to use
We were able to install so now we will try using morphological analyzer using python3. We will try to analyze the following sentence from Wikipedia.
AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。
#!/usr/bin/python # -*- coding: utf-8 -*- import MeCab sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。 これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。""" t = MeCab.Tagger('') print(t.parse(sentence))
Execution result
AWS 名詞,固有名詞,組織,*,*,*,* の 助詞,連体化,*,*,*,*,の,ノ,ノ 有名 名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイ な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ サービス 名詞,サ変接続,*,*,*,*,サービス,サービス,サービス に 助詞,格助詞,一般,*,*,*,に,ニ,ニ Amazon 名詞,一般,*,*,*,*,* Elastic 名詞,一般,*,*,*,*,* Compute 名詞,一般,*,*,*,*,* Cloud 名詞,一般,*,*,*,*,* ( 名詞,サ変接続,*,*,*,*,* EC 名詞,一般,*,*,*,*,* 2 名詞,数,*,*,*,*,* ) 名詞,サ変接続,*,*,*,*,* と 助詞,並立助詞,*,*,*,*,と,ト,ト Amazon 名詞,固有名詞,組織,*,*,*,* Simple 名詞,一般,*,*,*,*,* Storage 名詞,一般,*,*,*,*,* Service 名詞,一般,*,*,*,*,* ( 名詞,サ変接続,*,*,*,*,* S 名詞,一般,*,*,*,*,* 3 名詞,数,*,*,*,*,* ) 名詞,サ変接続,*,*,*,*,* が 助詞,格助詞,一般,*,*,*,が,ガ,ガ ある 動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル 。 記号,句点,*,*,*,*,。,。,。 これ 名詞,代名詞,一般,*,*,*,これ,コレ,コレ まで 助詞,副助詞,*,*,*,*,まで,マデ,マデ の 助詞,連体化,*,*,*,*,の,ノ,ノ クライアント 名詞,一般,*,*,*,*,* が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 保有 名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユー し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ て 助詞,接続助詞,*,*,*,*,て,テ,テ い 動詞,非自立,*,*,一段,連用形,いる,イ,イ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 物理 名詞,一般,*,*,*,*,物理,ブツリ,ブツリ 的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ サーバ 名詞,一般,*,*,*,*,サーバ,サーバ,サーバ ファーム 名詞,一般,*,*,*,*,ファーム,ファーム,ファーム と 助詞,格助詞,一般,*,*,*,と,ト,ト 比較 名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカク し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ て 助詞,接続助詞,*,*,*,*,て,テ,テ AWS 名詞,一般,*,*,*,*,* は 助詞,係助詞,*,*,*,*,は,ハ,ワ 大 接頭詞,名詞接続,*,*,*,*,大,ダイ,ダイ 規模 名詞,一般,*,*,*,*,規模,キボ,キボ な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ 計算 名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン 処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ 能力 名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョク を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 速やか 名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカ に 助詞,副詞化,*,*,*,*,に,ニ,ニ 提供 名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー 出来る 動詞,自立,*,*,一段,基本形,出来る,デキル,デキル こと 名詞,非自立,一般,*,*,*,こと,コト,コト が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 強み 名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミ で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル 。 記号,句点,*,*,*,*,。,。,。 EOS
We will use mecab-ipadic-NEologd's dictionary because EC2 and S3 were divided like EC and 2, S and 3.
#!/usr/bin/python # -*- coding: utf-8 -*- import MeCab sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。 これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。""" t = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') print(t.parse(sentence))
Execution result
AWS 名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス の 助詞,連体化,*,*,*,*,の,ノ,ノ 有名 名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイ な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ サービス 名詞,サ変接続,*,*,*,*,サービス,サービス,サービス に 助詞,格助詞,一般,*,*,*,に,ニ,ニ Amazon 名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン Elastic 名詞,固有名詞,一般,*,*,*,Elastic,エラスティック,エラスティック Compute 名詞,一般,*,*,*,*,* Cloud 名詞,一般,*,*,*,*,* ( 記号,一般,*,*,*,*,* EC2 名詞,固有名詞,一般,*,*,*,EC2,イーシーツー,イーシーツー ) 記号,一般,*,*,*,*,* と 助詞,並立助詞,*,*,*,*,と,ト,ト Amazon 名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン Simple 名詞,固有名詞,一般,*,*,*,Simple,シンプル,シンプル Storage 名詞,一般,*,*,*,*,* Service 名詞,一般,*,*,*,*,* ( 記号,一般,*,*,*,*,* S3 名詞,固有名詞,人名,一般,*,*,S3,エススリーマイルスボニーアンドブレンクシナトラ,エススリーマイルスボニーアンドブレンクシナトラ ) 記号,一般,*,*,*,*,* が 助詞,格助詞,一般,*,*,*,が,ガ,ガ ある 動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル 。 記号,句点,*,*,*,*,。,。,。 これ 名詞,代名詞,一般,*,*,*,これ,コレ,コレ まで 助詞,副助詞,*,*,*,*,まで,マデ,マデ の 助詞,連体化,*,*,*,*,の,ノ,ノ クライアント 名詞,固有名詞,一般,*,*,*,client,クライアント,クライアント が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 保有 名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユー し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ て 助詞,接続助詞,*,*,*,*,て,テ,テ い 動詞,非自立,*,*,一段,連用形,いる,イ,イ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 物理 名詞,一般,*,*,*,*,物理,ブツリ,ブツリ 的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ サーバファーム 名詞,固有名詞,一般,*,*,*,サーバファーム,サーバファーム,サーバファーム と 助詞,格助詞,一般,*,*,*,と,ト,ト 比較 名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカク し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ て 助詞,接続助詞,*,*,*,*,て,テ,テ AWS 名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス は 助詞,係助詞,*,*,*,*,は,ハ,ワ 大規模 名詞,一般,*,*,*,*,大規模,ダイキボ,ダイキボ な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ 計算 名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン 処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ 能力 名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョク を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 速やか 名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカ に 助詞,副詞化,*,*,*,*,に,ニ,ニ 提供 名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー 出来る 動詞,自立,*,*,一段,基本形,出来る,デキル,デキル こと 名詞,非自立,一般,*,*,*,こと,コト,コト が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 強み 名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミ で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル 。 記号,句点,*,*,*,*,。,。,。 EOS
This time EC2 and S3 could also be split correctly as nouns. Although it is described mecab-ipadic-NEologd : Neologism dictionary for MeCab, it is good to use mecab-ipadic-NEologd when analyzing documents on the Web.
We could analyze sentences but we want to get only a specific part of speech. We can pick out only nouns as follows.
#!/usr/bin/python # -*- coding: utf-8 -*- import MeCab sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。 これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。""" t = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') t.parse('') m = t.parseToNode(sentence) while m: if m.feature.split(',')[0] == '名詞': print(m.surface) m = m.next
Execution result
AWS 名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス 有名 名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイ サービス 名詞,サ変接続,*,*,*,*,サービス,サービス,サービス Amazon 名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン Elastic 名詞,固有名詞,一般,*,*,*,Elastic,エラスティック,エラスティック Compute 名詞,一般,*,*,*,*,* Cloud 名詞,一般,*,*,*,*,* EC2 名詞,固有名詞,一般,*,*,*,EC2,イーシーツー,イーシーツー Amazon 名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン Simple 名詞,固有名詞,一般,*,*,*,Simple,シンプル,シンプル Storage 名詞,一般,*,*,*,*,* Service 名詞,一般,*,*,*,*,* S3 名詞,固有名詞,人名,一般,*,*,S3,エススリーマイルスボニーアンドブレンクシナトラ,エススリーマイルスボニーアンドブレンクシナトラ これ 名詞,代名詞,一般,*,*,*,これ,コレ,コレ クライアント 名詞,固有名詞,一般,*,*,*,client,クライアント,クライアント 保有 名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユー 物理 名詞,一般,*,*,*,*,物理,ブツリ,ブツリ 的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ サーバファーム 名詞,固有名詞,一般,*,*,*,サーバファーム,サーバファーム,サーバファーム 比較 名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカク AWS 名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス 大規模 名詞,一般,*,*,*,*,大規模,ダイキボ,ダイキボ 計算 名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン 処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ 能力 名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョク 速やか 名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカ 提供 名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー こと 名詞,非自立,一般,*,*,*,こと,コト,コト 強み 名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミ
If you want to retrieve the results in a list, you can write the code as follows.
#!/usr/bin/python # -*- coding: utf-8 -*- import MeCab sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。 これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。""" t = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') t.parse('') m = t.parseToNode(sentence) keywords = [] while m: if m.feature.split(',')[0] == '名詞': keywords.append(m.surface) m = m.next print(keywords)
Execution result
['AWS', '有名', 'サービス', 'Amazon', 'Elastic', 'Compute', 'Cloud', 'EC2', 'Amazon', 'Simple', 'Storage', 'Service', 'S3', 'これ', 'クライアント', '保有', '物理', '的', 'サーバファーム', '比較', 'AWS', '大規模', '計算', '処理', '能力', '速やか', '提供', 'こと', '強み']
Tips
This code parsed t.parse('') and empty character in code. If I did not do this, then the following error would occurr.
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 0: invalid continuation byte
Conclusion
This time we tried morphological analysis using MeCab. When analyzing documents on the Web, we recommend using the mecab-ipadic-NEologd dictionary.